package com.ykq;

import java.util.concurrent.*;

public class ThreadPoolExample {

    public static void main(String[] args) {
        // 创建一个固定大小的线程池
        int poolSize = 5; // 线程池的大小
        ExecutorService executorService = Executors.newFixedThreadPool(poolSize);

        // 创建多个任务
        int numberOfTasks = 10;
        for (int i = 0; i < numberOfTasks; i++) {
            int taskId = i;
            executorService.submit(() -> {
                // 模拟任务执行
                System.out.println("任务 " + taskId + " 开始执行");
                try {
                    Thread.sleep(1000); // 模拟耗时操作
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                    System.err.println("任务 " + taskId + " 被中断");
                }
                System.out.println("任务 " + taskId + " 执行完成");
            });
        }

        // 关闭线程池
        shutdownExecutorService(executorService);
    }

    /**
     * 关闭线程池的方法
     * @param executorService 线程池
     */
    private static void shutdownExecutorService(ExecutorService executorService) {
        // 禁止接受新任务
        executorService.shutdown();

        try {
            // 等待所有已提交的任务完成
            if (!executorService.awaitTermination(60, TimeUnit.SECONDS)) {
                // 如果在指定时间内没有完成所有任务，则强制关闭
                executorService.shutdownNow();
                // 再次等待未完成的任务
                if (!executorService.awaitTermination(60, TimeUnit.SECONDS))
                    System.err.println("线程池未能正常关闭");
            }
        } catch (InterruptedException e) {
            // 如果当前线程被中断，则强制关闭线程池
            executorService.shutdownNow();
            Thread.currentThread().interrupt();
        }
    }
}
